add fork-pr-workflow skill — factory-portable fork→upstream contribution flow#47
add fork-pr-workflow skill — factory-portable fork→upstream contribution flow#47
Conversation
…ion flow New capability skill (hat) covering the fork-based PR contribution flow: three-remote setup (origin=fork, upstream=canonical), feature- branch daily loop, per-PR upstream submission as the default rhythm, merge-queue + auto-merge compatibility with cross-repo PRs, common anti-patterns, and a clearly-labelled optional overlay for projects that batch upstream PRs on a non-default cadence. Factory-portable by design: no `project: zeta` frontmatter, no hardcoded Zeta paths or module names. The skill's default is per-PR immediate upstream (industry norm for OSS contribution); any project that overrides that rhythm (for example, batching every N fork PRs to amortise per-push upstream review cost) declares the override in a project-specific doc and cites it from there — the skill itself stays factory-portable. Complements `git-workflow-expert` (within-repo branch flow + sibling-clone convention for read-only OSS mirrors). Boundary is explicit in both skills' "What this skill does NOT do" sections: this one covers cross-repo fork PRs, the other covers within-repo branch PRs. Rationale: - Maintainer 2026-04-21: "we only need to upstram back to lfg like every 10prs" (Zeta-specific override motivation) - Maintainer 2026-04-21: "this only upstram ever 10 prs is pretty unique to this project ... most people push upstream after one PR" (establishes per-PR as industry default) - Maintainer 2026-04-21: "so the generic factory should default to immidate and the zeta override is every 10" (final design requirement: skill default = per-PR; Zeta override isolated to project-specific doc) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Adds a new factory-portable capability skill documenting the standard fork → upstream contribution workflow, including remote setup, daily feature-branch loop, merge-queue/auto-merge notes, and common anti-patterns.
Changes:
- Introduces
.claude/skills/fork-pr-workflow/SKILL.mddescribing a fork-based PR flow (origin=fork, upstream=canonical). - Documents an optional “batched upstream” overlay for cost-constrained projects.
- Adds troubleshooting guidance for cross-repo PR behaviors (merge queue, auto-merge, bot reviewers).
| # Sync fork's main with upstream before starting new work. | ||
| git fetch upstream | ||
| git checkout main | ||
| git merge --ff-only upstream/main | ||
| git push origin main |
There was a problem hiding this comment.
This skill is described as factory-portable, but the daily loop hardcodes the default branch name as main in multiple commands (checkout main, merge upstream/main, --base main). Repos still commonly use master or another default; consider using a <default-branch> placeholder consistently (as in the earlier gh pr create mention) or using upstream/HEAD after setting the remote head.
| a different working copy). That's the kind of | ||
| history-destruction event BP-24 warns against. |
There was a problem hiding this comment.
The --force-with-lease guidance is good, but the reference to “BP-24” here appears incorrect: BP-24 in docs/AGENT-BEST-PRACTICES.md is a consent/emulation rule, not a git history safety rule. Please remove the BP-24 reference or replace it with an accurate pointer.
| a different working copy). That's the kind of | |
| history-destruction event BP-24 warns against. | |
| a different working copy). That prevents the kind of | |
| history-destruction event this workflow is avoiding. |
| the GitHub "Compare & pull request" flow or | ||
| `gh pr create --repo <upstream> --base <default-branch> | ||
| --head <fork-owner>:<branch>`. |
There was a problem hiding this comment.
The inline code span for the cross-repo gh pr create ... command is split across two lines (the opening backtick is on one line and the closing backtick is on the next). Most Markdown renderers (and markdownlint) do not support multi-line inline code spans, so this will render incorrectly and may fail lint. Use a fenced code block or keep the entire inline command on a single line.
| the GitHub "Compare & pull request" flow or | |
| `gh pr create --repo <upstream> --base <default-branch> | |
| --head <fork-owner>:<branch>`. | |
| the GitHub "Compare & pull request" flow or `gh pr create --repo <upstream> --base <default-branch> --head <fork-owner>:<branch>`. |
| Three named remotes in your local clone: | ||
|
|
||
| - **`origin`** — your personal fork (read/write you own). | ||
| - **`upstream`** — the canonical repo (read-only for | ||
| non-maintainers; maintainers can push but usually | ||
| don't). | ||
| - No third remote unless you're syncing across multiple | ||
| forks (rare). |
There was a problem hiding this comment.
This section says “Three named remotes in your local clone” but then only defines origin and upstream (and explicitly says no third remote). This reads like a factual inconsistency; either change it to “Two named remotes” or define what the third remote is meant to be.
Four Copilot findings: 1. "Schema per row #44" misref — row #44 on main is "Supply- chain safe-patterns audit"; fire-history schema is defined in row #47 "Cadence-history tracking hygiene". Fixed in docs/hygiene-history/backlog-refactor-history.md. 2. & 4. AutoDream research doc + row #53 dangling in-tree — clarified with "lands via PR #155" per the recurring xref pattern. 3. Row #54 not in main + memory file missing — same lands-via-PR pattern (#166 for row #54; memory lives in per-user, already noted in the row content). No code change; thread will be resolved with reply. Meta-finding: row #47 itself contains internal self-references calling itself "row #44" (from a prior row-number era that renumbered without updating self-refs). This is a pre-existing inconsistency, not caused by this PR. Candidate for backlog- refactor hygiene #54 sweep when it fires against FACTORY-HYGIENE.md. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ught 4 Copilot findings on PR #168: 2 xref (lands-via-#155); 1 row-number misreference ("Schema per row #44" was actually #47 — row #44 is supply-chain; #47 is cadence-history); 1 combined reply-with-rationale. Meta-finding (commit-body only, not this PR's scope): row #47 itself has internal self-refs calling itself "row #44" from a prior renumbering. Flagged as candidate for row #54 first-fire sweep. Fixed docs/hygiene-history/backlog-refactor-history.md + docs/BACKLOG.md; rebased; pushed. 4 threads resolved. Observation: row-number misref is a new finding class I hadn't seen. Copilot review caught it; target for row #54 sweeps. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ow) (#168) * hygiene: first backlog-refactor fire — knowledge-absorb update on AutoDream row First firing of FACTORY-HYGIENE row #54 (backlog-refactor cadenced audit), bounded to a single knowledge-absorb pass on one row. Target: the "Retraction-native memory-consolidation (better dream mode) research project" row. Updated to cross-reference the newer AutoDream extension-overlay policy (PR #155) + row #53. The better-dream-mode project is reframed as the more-ambitious second step conditional on the overlay policy proving insufficient — not the primary AutoDream response anymore. Fire-history file landed at docs/hygiene-history/backlog-refactor-history.md per row #44 obligation. First entry documents the bounded-pilot approach (one row updated, no retires, pre/post row count approximately unchanged). Self-scheduled free work under the 2026-04-23 scheduling- authority rule. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * hygiene: address PR #168 review findings Four Copilot findings: 1. "Schema per row #44" misref — row #44 on main is "Supply- chain safe-patterns audit"; fire-history schema is defined in row #47 "Cadence-history tracking hygiene". Fixed in docs/hygiene-history/backlog-refactor-history.md. 2. & 4. AutoDream research doc + row #53 dangling in-tree — clarified with "lands via PR #155" per the recurring xref pattern. 3. Row #54 not in main + memory file missing — same lands-via-PR pattern (#166 for row #54; memory lives in per-user, already noted in the row content). No code change; thread will be resolved with reply. Meta-finding: row #47 itself contains internal self-references calling itself "row #44" (from a prior row-number era that renumbered without updating self-refs). This is a pre-existing inconsistency, not caused by this PR. Candidate for backlog- refactor hygiene #54 sweep when it fires against FACTORY-HYGIENE.md. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Copilot caught two row-number inconsistencies: - "Cross-platform parity (FACTORY-HYGIENE row #48)" was incorrect — row #48 is GitHub surface triage; cross- platform parity is row #51. Fixed. - "fire-log surfaces per row #44" was incorrect — row #44 is supply-chain safe-patterns; cadence-history / fire- history schema is row #47. Fixed + clarified. Third finding (docs/research/multi-repo-refactor-shapes path) — will be handled via reply-with-rationale (lands via PR #150, still open). Row-number misref is a recurring finding class across session PRs; candidate sweep target for backlog-refactor hygiene row #54 first cadenced fire. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…w-number fixes PR #159 (Overlay A #3 deletions-over-insertions) MERGED at 18:02:47Z. 11 session PRs merged. HLL test passed on re-run (different seed) — real-world data for the PR #175 BACKLOG row on HLL flakiness; pin-then-explore is still the right fix. Aaron directive: "be PC when you write the 69 and 420 descriptions of whemsy we want this repo to be high school curruclurm friendly so R rated is okay but only when necessary for effect." PC-ified seed-whimsy memory descriptions (69 → internet-meme-symmetrical-digit; 420 → counterculture-meme). Added PC-framing section naming the high-school-curriculum-friendly standard. PR #172 row-number misrefs fixed (#48 → #51 for cross- platform parity; #44 → #47 for fire-history schema). Third finding via lands-via-#150 reply. Row-number misref is recurring; candidate for row #54 first cadenced fire. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…o-split) (#172) * backlog: P2 — factory status UI on GitHub Pages (git-native, post-repo-split) Aaron 2026-04-23: "static ui on our github pages that shows factory status things in flight progress, etc ... we can surface thing in the ui like the decions and any decions we would like human feedback on ... all this should be able to use our gitnative approach and not really cost anyting ... backlog this and probaby not a good idea until after the repo split into the different projects." Row captures: - Goal: static UI surfacing factory state (PRs, ADRs, HUMAN-BACKLOG asks, round progress) - Constraint: git-native + ~free (static SSG regenerated by GitHub Action; no paid SaaS) - Tech candidates deferred (Jekyll / Hugo / Astro / Eleventy / bun-based custom SSG — bun aligns with post-setup stack row #49) - Sequencing: after multi-repo split (PR #150 prerequisite) - Cross-refs to AGENT-GITHUB-SURFACES Pages row, HUMAN- BACKLOG, DECISIONS, ROUND-HISTORY, hygiene-history P2 per Aaron's "probably not a good idea until after the repo split" sequencing hint. Self-scheduled free work (row-filing) under the 2026-04-23 scheduling-authority rule. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * backlog: Pages-UI row — add read-only-first / write-later refinement Aaron 2026-04-23: "ui will likely need gh, our repo is public so for all the read actions on the ui we are good without permission, for write actions we probably don't need this yet would need whole permission set and resue of the github logins session stuff without a real backend, tricky stuff so readonly to expaned to write access later. backlog just a little refinement." Row updated with: - Phase 1 read-only: GitHub REST API against public repo, no auth (rate-limit applies; acceptable per-push-refresh dashboard) - Phase 2 write: needs GitHub session/OAuth or thin backend; both break git-native + ~free-to-run; deferred until tradeoff re-examined Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * backlog: Pages-UI row — bun+TS as tech choice; Jekyll excluded per maintainer Aaron 2026-04-23 reminder: "i'm fine with either but last time you push me hard away from jekyll that i think we only need typescript bun based and no jekyll unless you tell me otherwise." Row updated: - Tech choice is bun + TypeScript SSG (composes with FACTORY-HYGIENE row #49 post-setup stack default) - Jekyll explicitly excluded - Hugo / Astro / Eleventy demoted from listed candidates - If a compelling reason to revisit Jekyll surfaces during research, it lands as an ADR with explicit rationale; default is bun+TS Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * backlog: Pages-UI row — fix Jekyll-exclusion attribution (Kenji, not maintainer) Aaron 2026-04-23: "technically Kenji told me to exclude this not me, feel free to reevnualte but take the whole project into consideration". Row updated: - Attribution corrected: Kenji (Architect persona) made the bun+TS-over-Jekyll recommendation, not the maintainer directly - Re-evaluation with whole-project consideration documented: cross-platform parity (row #48), post-setup stack default (row #49), one-language-rule (no new Ruby chain), GitHub Pages + Actions build pattern works regardless of native- Pages SSG support, bun+SSG ecosystem rich enough - Conclusion: Kenji's call stands after re-examination Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * backlog: Pages-UI row — apply plural-host distinction (git-native content vs GitHub adapter) Aaron 2026-04-23: "i guess pages is github native, but our code can likely be git native only need git and not gh commands but gh commands are welcome we just need to call out gh becasue we want to be pluggable eventually to gitlab to, we are gitnative with our first host as github." Row constraint-section refined to distinguish: - Git-native content (PRs / ADRs / HUMAN-BACKLOG / CONTRIBUTOR-CONFLICTS / ROUND-HISTORY / hygiene-history — lives in repo regardless of host) - GitHub adapter (Pages + Actions + REST API are GitHub-specific; UI itself is explicitly labeled as the GitHub adapter against the git-native content spec) When a second host activates (GitLab / Gitea / Bitbucket), a sibling adapter ships against the same content spec. First host is GitHub per "gitnative with our first host as github". Full plural-host discipline in per-user memory feedback_git_native_vs_github_native_plural_host_pluggable_adapters_2026_04_23.md. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * backlog: Pages-UI row — fix row-number misrefs per PR #172 review Copilot caught two row-number inconsistencies: - "Cross-platform parity (FACTORY-HYGIENE row #48)" was incorrect — row #48 is GitHub surface triage; cross- platform parity is row #51. Fixed. - "fire-log surfaces per row #44" was incorrect — row #44 is supply-chain safe-patterns; cadence-history / fire- history schema is row #47. Fixed + clarified. Third finding (docs/research/multi-repo-refactor-shapes path) — will be handled via reply-with-rationale (lands via PR #150, still open). Row-number misref is a recurring finding class across session PRs; candidate sweep target for backlog-refactor hygiene row #54 first cadenced fire. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
… row #55) (#198) Per Aaron 2026-04-23 Otto-27: "we can have a machine specific scrubber/lint hygene task for anyting that makes it in by default" + "just run on a cadence." Files added: - tools/hygiene/audit-machine-specific-content.sh — scans tracked files for machine-specific patterns (/Users/<name>/, /home/<name>/, C:\Users\<name>, C:/Users/<name>). Detect-only; --list + --enforce modes. - docs/FACTORY-HYGIENE.md row #55 — full schema per existing hygiene-row pattern; Dejan (devops-engineer) on cadenced fire; classified prevention-bearing (row #47 taxonomy). Baseline at first fire: 9 gaps across .claude/skills/, docs/ PDFs, and one legitimate anti-example reference in memory/feedback_path_hygiene.md. All pre-existing; this row surfaces them for opportunistic cleanup. Exclusions (historical content preserved verbatim per append-only discipline): - docs/ROUND-HISTORY.md - docs/hygiene-history/** - docs/DECISIONS/** - the audit script itself (patterns as examples) Composes with Otto-27 Option D in-repo-first policy (PR #197 migrating CURRENT-*.md files) — the scrubber prevents machine-specific leakage as new content enters the in-repo boundary by default. Attribution: Otto (loop-agent PM hat) scripted the audit; Dejan (devops-engineer) owns cadenced operation. Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
…ORY-HYGIENE row #56) Prevents recurring regression hit 3× in session. Tool: tools/hygiene/audit-md032-plus-linestart.sh. Baseline: 3 pre-existing gaps in persona notebooks. Detect-only; --list + --enforce modes. FACTORY-HYGIENE row #56 with full schema. Classified prevention-bearing per row #47 taxonomy. Pivot discipline: attempted linguistic-seed term #2 equality but #202 truth still BLOCKED/OPEN (directory not on main yet). Pivoted to row #56 work instead of stacking dependent substrate. Third tool-hardening landing in session (after #198 scrubber + #199 batch-resolve). Tool-substrate developing alongside content. Attribution: Otto (loop-agent PM hat). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…action item #1) (#220) Amara's 2026-04-23 decision-proxy + technical review courier (PR #219) ranked memory-index-integrity CI as her highest-value immediate fix: directly prevents the NSA-001 measured failure mode (new memory landed without MEMORY.md pointer → undiscoverable from fresh session). New workflow: `.github/workflows/memory-index-integrity.yml` Check: if a PR (or push to main) adds or modifies any top-level `memory/*.md` file, `memory/MEMORY.md` MUST also be in the same range. Fails with an explicit remediation message citing NSA-001. Scope excludes: - memory/persona/** (per-persona notebooks have their own lifecycle) - memory/README.md (convention doc) - memory/MEMORY.md (the index itself) - Deletions (covered from the other direction by FACTORY- HYGIENE row #25 pointer-integrity audit) Safe-pattern compliant per FACTORY-HYGIENE row #43: - actions/checkout@de0fac2... SHA-pinned - Explicit minimum `permissions: contents: read` - Only first-party trusted context (github.sha, github.event.pull_ request.base.sha, github.event.before) passed via env: - No user-authored context referenced anywhere - concurrency group + cancel-in-progress: false - runs-on: ubuntu-22.04 pinned - actionlint clean; shellcheck clean (SC2086 fixed) FACTORY-HYGIENE row #58 added documenting the cadence / owner / scope / durable output + classification (row #47: prevention- bearing — blocks merge before substrate diverges from index). Row numbered 58 to leave #56 reserved for in-flight PR #204 (MD032 preflight) and #57 for in-flight PR #213 (git-hotspots audit). Ships to project-under-construction: adopters inherit the workflow unchanged; the memory/**.md + memory/MEMORY.md conventions are factory-generic. Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
…ax, seeded hygiene-history, IP template cleanup - UPSTREAM-RHYTHM.md: fix compare basehead syntax (Codex P1 — use owner:branch, not owner:repo:branch) - AGENT-GITHUB-SURFACES.md + github-surface-triage SKILL.md: FACTORY-HYGIENE row refs #44→#47, #45→#48 - AGENT-ISSUE-WORKFLOW.md: soften "BACKLOG row is open" to "TODO: file a BACKLOG row" - research/lfg-only-capabilities-scout.md: clarify HB-001 is resolved org-migration; merge queue is follow-up - BACKLOG.md: unsplit inline-code spans in P3 LFG row - hygiene-history/{wiki,discussions}-history.md: seed files referenced by Surface 3/4 docs - .github/ISSUE_TEMPLATE/feature_request.md: remove stale GitHub default template (Zeta set covers bug_report/backlog_item/human_ask) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs: add UPSTREAM-RHYTHM.md — Zeta's fork-first batched PR cadence (#2) The fork-pr-workflow skill defers the upstream-cadence choice to project-level config. This is Zeta's config: - Default PR target: AceHack/Zeta:main (free CI, free Copilot) - Bulk sync AceHack/main -> LFG/main every ~10 PRs (one PR, not N) - Five named exceptions for direct-to-LFG (security P0, external contributor, Aaron explicit, CI-repair, the bulk-sync PR itself) - Concrete gh commands for each case - Proposed cadence-monitor FACTORY-HYGIENE row Resolves a phantom pointer in memory/feedback_fork_pr_cost_model_prs_land_on_acehack_sync_to_lfg_in_bulk.md which cited docs/UPSTREAM-RHYTHM.md as an intended target. Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com> * docs: scout LFG-only capabilities; add 6th direct-to-LFG exception; P3 BACKLOG row Aaron 2026-04-22 clarified LFG is not just "paid surface to avoid" but a throttled experimental tier: Copilot Business + Teams plan, all enhancements enabled (internet search, coding agent, etc.). Standing permission to change any LFG setting except the $0 budget cap and personal info. Enterprise upgrade offered if we build a large-enough LFG-only backlog to justify it. Changes: - docs/research/lfg-only-capabilities-scout.md — new scouting doc. Verified Copilot Business plan via gh api; enumerates 10 candidate experiments across Copilot Business, Teams plan, Actions runner classes, and org-level features. Each has a cadence. Declines self-hosted runners and raising the budget cap. - docs/UPSTREAM-RHYTHM.md — adds a 6th direct-to-LFG exception ("LFG-only capability experiment") so these experiments don't fight the batched cost model. - docs/BACKLOG.md — new P3 row "LFG-only experiment track (throttled)" pointing at the scout doc; gated on the 10-item threshold for the Enterprise upgrade conversation. Source memory: memory/feedback_lfg_paid_copilot_teams_throttled_experiments_allowed.md Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * docs: address PR #139 review threads — row-number fixes, compare syntax, seeded hygiene-history, IP template cleanup - UPSTREAM-RHYTHM.md: fix compare basehead syntax (Codex P1 — use owner:branch, not owner:repo:branch) - AGENT-GITHUB-SURFACES.md + github-surface-triage SKILL.md: FACTORY-HYGIENE row refs #44→#47, #45→#48 - AGENT-ISSUE-WORKFLOW.md: soften "BACKLOG row is open" to "TODO: file a BACKLOG row" - research/lfg-only-capabilities-scout.md: clarify HB-001 is resolved org-migration; merge queue is follow-up - BACKLOG.md: unsplit inline-code spans in P3 LFG row - hygiene-history/{wiki,discussions}-history.md: seed files referenced by Surface 3/4 docs - .github/ISSUE_TEMPLATE/feature_request.md: remove stale GitHub default template (Zeta set covers bug_report/backlog_item/human_ask) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
…56) Addresses recurring MD032 regression hit 3 times in Otto-session (Otto-35 + Otto-38 + Otto-38 again). Pattern: author writes prose continuation like Full treatment in the DBSP paper + docs/ARCHITECTURE.md §operator-algebra. and markdownlint parses the '+ ' as a list item, firing MD032 (list not surrounded by blank lines). Tool: tools/hygiene/audit-md032-plus-linestart.sh — scans tracked .md files for '^+ ' with non-blank previous line. Skips files using '+ ' consistently as bullet style (3+ occurrences). --list / --enforce modes per row #55 pattern. Baseline at first fire: 3 pre-existing gaps in persona notebooks (memory/persona/best-practices- scratch.md, ilyana/NOTEBOOK.md, kenji/OFFTIME.md). Detect-only; enforce-transition deferred. FACTORY-HYGIENE row #56 lands with full schema per row #55 pattern. Classified prevention-bearing (row #47 taxonomy). Attribution: Otto (loop-agent PM hat). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…56) Addresses recurring MD032 regression hit 3 times in Otto-session (Otto-35 + Otto-38 + Otto-38 again). Pattern: author writes prose continuation like Full treatment in the DBSP paper + docs/ARCHITECTURE.md §operator-algebra. and markdownlint parses the '+ ' as a list item, firing MD032 (list not surrounded by blank lines). Tool: tools/hygiene/audit-md032-plus-linestart.sh — scans tracked .md files for '^+ ' with non-blank previous line. Skips files using '+ ' consistently as bullet style (3+ occurrences). --list / --enforce modes per row #55 pattern. Baseline at first fire: 3 pre-existing gaps in persona notebooks (memory/persona/best-practices- scratch.md, ilyana/NOTEBOOK.md, kenji/OFFTIME.md). Detect-only; enforce-transition deferred. FACTORY-HYGIENE row #56 lands with full schema per row #55 pattern. Classified prevention-bearing (row #47 taxonomy). Attribution: Otto (loop-agent PM hat). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…204) * hygiene: MD032 '+'-at-line-start preflight audit (FACTORY-HYGIENE row #56) Addresses recurring MD032 regression hit 3 times in Otto-session (Otto-35 + Otto-38 + Otto-38 again). Pattern: author writes prose continuation like Full treatment in the DBSP paper + docs/ARCHITECTURE.md §operator-algebra. and markdownlint parses the '+ ' as a list item, firing MD032 (list not surrounded by blank lines). Tool: tools/hygiene/audit-md032-plus-linestart.sh — scans tracked .md files for '^+ ' with non-blank previous line. Skips files using '+ ' consistently as bullet style (3+ occurrences). --list / --enforce modes per row #55 pattern. Baseline at first fire: 3 pre-existing gaps in persona notebooks (memory/persona/best-practices- scratch.md, ilyana/NOTEBOOK.md, kenji/OFFTIME.md). Detect-only; enforce-transition deferred. FACTORY-HYGIENE row #56 lands with full schema per row #55 pattern. Classified prevention-bearing (row #47 taxonomy). Attribution: Otto (loop-agent PM hat). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * hygiene: fix MD038 trailing-space-in-code-span on row #56 Replaced '`+ `' + '`^+ `' with '`+` followed by space' + '`^+` (plus-at-line-start followed by space)' to remove trailing spaces inside code spans. Markdownlint MD038 rule forbids leading/trailing spaces in code spans. The semantic meaning ('+' followed by space character) is now in prose. Attribution: Otto (loop-agent PM hat). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * hygiene: rewrite MD032 audit for CommonMark correctness + review-drain fixes (PR #204 threads) Addresses 19 unresolved review threads on PR #204 clustered into six distinct issues — consolidated into a single cohesive rewrite: * NUL-delimited `git ls-files -z | while read -d ''` iteration (whitespace-safe paths; matches sibling hygiene-script convention). * `cd "$(git rev-parse --show-toplevel)"` first so paths resolve from repo root regardless of $PWD. * Previous-line blank check strips all whitespace (spaces, tabs, CR) via `${var//[[:space:]]/}` — tab-only predecessors count as blank. * Contiguous `+ `-list detection: if the previous line is itself a `^ {0,3}\+ ` marker line, it's list continuation, not a gap. * CommonMark-compliant pattern `^ {0,3}\+ ` — up to 3 leading spaces allowed on `+ `-marker lines (indented `+` in header example now matched). * `plus_lines_count >= 3` file-level skip heuristic removed — per-line contiguous-list detection makes it unnecessary and was masking false negatives (file could mostly use `+` as list marker while still containing a stray prose-continuation `+`). * Post-setup stack header added to match sibling convention. * Portability: `while read`-based file load instead of `mapfile` (macOS bash 3.2 parity). FACTORY-HYGIENE.md row #56 description updated to match the new behaviour (pre-merge refinement of the new row, permitted under append-only audit-trail discipline). Build: 0W/0E. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * hygiene: markdownlint-fix MD038/MD056 on FACTORY-HYGIENE row #56 Line 102 in docs/FACTORY-HYGIENE.md triggered 11 MD038 (no-space-in-code) warnings and 1 MD056 (table-column-count) warning. Rewrote the row text to: - Replace code-span literals that started or ended with a space (`+ `, `^ {0,3}\+ `, `. Excludes: `, `, `, `; `, etc) with prose phrasings that keep the meaning without the MD038-tripping whitespace inside backticks. - Split the `git ls-files -z | while read -d ''` code span into two separate spans so the `|` does not land inside a code-span in a table cell (markdownlint-cli2 was counting it as a ninth column against the 8-column header). No semantic change to the hygiene rule itself; no changes to tools/hygiene/audit-md032-plus-linestart.sh. Full repo markdownlint-cli2@0.18.1 run is clean; dotnet build -c Release is 0W/0E. * hygiene: fix sibling-script citation in audit-md032 comment Copilot caught that audit-memory-references.sh doesn't use `git ls-files -z` iteration (it parses a single target file). Replace with audit-post-setup-script-stack.sh which does use the NUL-delimited pattern. No behaviour change; comment only. Addresses PR #204 Copilot review thread on line 82. --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Summary
.claude/skills/fork-pr-workflow/SKILL.mdcovering three-remote setup (origin=fork, upstream=canonical), the feature-branch daily loop, per-PR upstream submission as the default rhythm, merge-queue + auto-merge compatibility with cross-repo PRs, pre-flight checklist, and common anti-patterns.project: zetafrontmatter, no hardcoded Zeta paths or module names. Default rhythm is per-PR immediate upstream (industry norm for OSS contribution); projects that override that rhythm do so in a project-specific doc and cite it from there.git-workflow-expert(within-repo branch flow + sibling-clone convention for read-only OSS mirrors). Boundary is explicit in both skills' "What this skill does NOT do" sections.Why
Maintainer signal thread 2026-04-21:
The first AceHack/Zeta → Lucent-Financial-Group transfer (2026-04-21) established LFG as the canonical repo. The fork contribution path is how both human and agent contributors will reach it — the skill gives them a factory-portable procedure for that path.
Test plan
actionlint-equivalent mental lint: frontmatter is valid YAML, body is markdown-clean.git-workflow-expert.🤖 Generated with Claude Code